package cn.edu.cug.cs.gtl.gsm.aof;

import cn.edu.cug.cs.gtl.common.Pair;
import cn.edu.cug.cs.gtl.gsm.item.IndexMap;
import cn.edu.cug.cs.gtl.gsm.item.MetaItem;

import java.io.IOException;

public interface IndexFile {
    /**
     * 创建索引文件，长度为0
     * @return
     * @throws IOException
     */
    boolean create() throws IOException;

    /**
     * 删除索引文件
     * @return
     * @throws IOException
     */
    boolean drop() throws IOException;

    /**
     * 索引文件是否存在
     * @return
     * @throws IOException
     */
    boolean exists() throws IOException;

    /**
     * 将元信息和索引信息写入索引文件
     * @param metaItem
     * @param indexMap
     * @return
     * @throws IOException
     */
    boolean write(MetaItem metaItem, IndexMap indexMap) throws IOException;

    /**
     * 从索引文件中读取元数据信息和索引信息
     * @param metaItem
     * @param indexMap
     * @return
     * @throws IOException
     */
    boolean read(MetaItem metaItem, IndexMap indexMap) throws IOException;

    /**
     * 从索引文件中读取元数据信息和索引信息
     *
     * @return
     * @throws IOException
     */
    default Pair<MetaItem, IndexMap> read() throws IOException{
        MetaItem metaItem = new MetaItem(0,0);
        IndexMap indexMap = new IndexMap();
        if(read(metaItem,indexMap))
            return new Pair<>(metaItem,indexMap);
        else
            return null;
    }
}
